#define _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>
//int main() 
//{
//    FILE* pf = fopen("test.dat", "r");//没有文件会创造一个文件
//    // 检查是否为空指针
//    if (pf == NULL) 
//    {
//        perror("fopen");
//        return 1;
//    }
//    /* 写文件略 */
//    // 关闭文件
//    fclose(pf);
//    pf = NULL; // 记得将pf置为空指针
//    return 0;
//}

//#include <stdio.h>
//int main()
//{
//    FILE* pf = fopen("test.txt", "w");
//    if (pf == NULL)
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 写文件
//    fputc('a', pf);
//    fputc('b', pf);
//    fputc('c', pf);
//    // 关闭文件
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//#include <stdio.h>
//// 使用fgetc从文件里读
//int main() 
//{
//    FILE* pf = fopen("test.txt", "r");
//    if (pf == NULL) 
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 读文件
//    int ret = fgetc(pf);
//    printf("%c\n", ret);
//    ret = fgetc(pf);
//    printf("%c\n", ret);
//    ret = fgetc(pf);
//    printf("%c\n", ret);
//    // 关闭文件
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//#include <stdio.h>
//int main() 
//{
//    FILE* pf = fopen("test2.txt", "w");
//    if (pf == NULL) 
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 写文件 - 按照行来写
//    fputs("abcdef\n", pf);//文件里也会显示换行效果
//    fputs("123456", pf);
//    // 关闭文件
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//#include <stdio.h>
//int main() 
//{
//    char arr[10] = "xxxxxx"; // 存放处
//    FILE* pf = fopen("test2.txt", "r");
//    if (pf == NULL) 
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 读文件 - 按照行来读
//    fgets(arr, 4, pf);
//    printf("%s\n", arr);
//    fgets(arr, 4, pf);
//    printf("%s\n", arr);
//    // 关闭文件
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}


//    fprintf
//#include <stdio.h>
//struct student
//{
//    char name[10];
//    int age;
//    float x;
//};
//int main()
//{
//    struct student s = { "GR", 19, 3.14f };
//    // 对格式化的数据进行写文件
//    FILE* pf = fopen("test3.txt", "w");
//    if (pf == NULL) 
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 写文件
//    fprintf(pf, "%s %d %f", s.name, s.age, s.x);
//
//    // 关闭文件
//    fclose(pf);
//    pf = NULL;
//
//    return 0;
//}

////    fwrite 
//#include <stdio.h>
//struct student
//{
//    char name[10];
//    int age;
//    float x;
//};
//int main()
//{
//    struct student s = { "GR", 19, 3.14f }; // 存放处
//
//    // 对格式化的数据进行写文件
//    FILE* pf = fopen("test4.txt", "w");
//    if (pf == NULL)
//    {
//        perror("fopen");
//        return 1;
//    }
//    //写文件
//    fwrite(&s, sizeof(struct student), 1, pf);
//
//    // 关闭文件
//    fclose(pf);
//    return 0;
//}

//fread
//#include <stdio.h>
//struct student 
//{
//    char name[10];
//    int age;
//    float x;
//};
//int main() 
//{
//    struct student s = { 0 }; // 存放处
//
//    // 对格式化的数据进行写文件
//    FILE* pf = fopen("test4.txt", "r");
//    if (pf == NULL) 
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 读文件
//    fread(&s, sizeof(struct student), 1, pf);
//
//    // 将读到的数据打印
//    printf("%s %d %f", s.name, s.age, s.x);
//
//    // 关闭文件
//    fclose(pf);
//    return 0;
//}

//#include <stdio.h>
//int main(void) 
//{
//    FILE* pf = fopen("test6.txt", "r");
//    if (pf == NULL)
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 读取文件
//    int ch = fgetc(pf);
//    printf("%c\n", ch);
//    ch = fgetc(pf);
//    printf("%c\n", ch);
//    ch = fgetc(pf);
//    printf("%c\n", ch);
//    // 关闭文件
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//#include <stdio.h>
//int main()
//{
//    FILE* pf = fopen("test6.txt", "r");
//    if (pf == NULL)
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 读取文件
//    int ch = fgetc(pf);
//    printf("%c\n", ch);//a
//    // 调整文件指针
//    fseek(pf, -2, SEEK_END); // SEEK_END为当前文件末尾位置，偏移量为-2，向前移动2个单位
//    ch = fgetc(pf);
//    printf("%c\n", ch);//e
//    ch = fgetc(pf);
//    printf("%c\n", ch);//f
//    // 关闭文件
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//#include <stdio.h>
//int main() 
//{
//    FILE* pf = fopen("test6.txt", "r");
//    if (pf == NULL) 
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 调整文件指针
//    fseek(pf, 5, SEEK_CUR); // SEEK_CUR为当前文件指针位置，偏移量为5，向后移动5个单位
//    // 读取文件
//    int ch = fgetc(pf);
//    printf("%c\n", ch); // f
//    // 返回偏移量
//    int ret = ftell(pf);
//    printf("%d\n", ret); // 6
//    // 让文件指针回到起始位置
//    rewind(pf);
//    ch = fgetc(pf);  //再读取一次
//    printf("%c\n", ch);//a
//    // 关闭文件
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//#include <stdio.h>
//int main() 
//{
//    int a = 10000;
//    FILE* pf = fopen("test6.txt", "wb");
//    if (pf == NULL) 
//    {
//        perror("fopen");
//        return 1;
//    }
//    // 写文件
//    fwrite(&a, sizeof(int), 1, pf); // 二进制的形式写到文件中
//    // 关闭文件
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//#include <stdio.h>
//#include <stdlib.h>
//int main() 
//{
//    int ch = 0; // 注意：为int型而非char，要求处理EOF
//    FILE* pf = fopen("test7.txt", "r");
//    if (!pf)// pf == NULL
//    { 
//        perror("fopen");
//        return EXIT_FAILURE; // 符号常量EXIT_FAILURE，表示没有成功地执行一个程序 就是return 1;
//    }
//    // fgetc - 当读取失败的时候或者遇到文件结束的时候，都会返回EOF
//    while ((ch = fgetc(pf)) != EOF) 
//    {
//        putchar(ch);
//    } 
//    printf("\n");
//    // 判断文件结束的原因
//    if (ferror(pf))  // ferror - 检查是否出现错误。
//    { 
//        puts("读取失败错误（I/O error when reading）");
//    }
//    else if (feof(pf)) 
//    {
//        puts("遇到文件尾而结束（End of file reached successfully) ");
//    }
//    // 文件关闭
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//#include <stdio.h>
//int main()
//{
//    FILE* pfread = fopen("file.txt", "r");
//    if (pfread == NULL) 
//    {
//        return 1;
//    }
//    FILE* pfwrite = fopen("file2.txt", "w");
//    if (pfwrite == NULL) 
//    {
//        fclose(pfread);
//        pfread = NULL;
//        return 1;
//    }
//    // 文件打开成功，读写文件
//    int ch = 0;
//    // 读文件
//    ch = fgetc(pfread);
//    while ((ch = fgetc(pfread)) != EOF) 
//    {
//        // 写文件
//        fputc(ch, pfwrite);
//    }
//    // 关闭文件
//    fclose(pfread);
//    pfread = NULL;
//    fclose(pfwrite);
//    pfwrite = NULL;
//    return 0;
//}

//#include <stdio.h>
//enum
//{
//    SIZE = 5
//};
//int main()
//{
//    double a[SIZE] = { 1.,2.,3.,4.,5. };
//
//    FILE* fp = fopen("test.bin", "wb"); // 必须用二进制模式
//    fwrite(a, sizeof * a, SIZE, fp); // 写double的数组
//    fclose(fp);
//
//    double b[SIZE];
//    fp = fopen("test.bin", "rb");
//    size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读double的数组
//    if (ret_code == SIZE) 
//    {
//        puts("数组读取成功，数组内容如下：");
//        for (int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
//        putchar('\n');
//    }
//    else 
//    { // 异常处理
//        if (feof(fp)) 
//        {
//            printf("test.bin 读取错误！unexpected end of file\n");
//        }
//        else if (ferror(fp)) 
//        {
//            perror("test.bin 读取错误！");
//        }
//    }
//    fclose(fp);
//    return 0;
//}

//#include <stdio.h>
//#include <windows.h>
//int main() 
//{
//	FILE* pf = fopen("test.txt", "w");
//	fputs("abcdef", pf);//先将代码放在输出缓冲区
//	printf("睡眠10秒-已经写数据了，打开test.txt文件，发现文件没有内容\n");
//	Sleep(10000);
//	printf("刷新缓冲区\n");
//	fflush(pf);//刷新缓冲区时，才将输出缓冲区的数据写到文件（磁盘）
//	//注：fflush 在高版本的VS上不能使用了
//	printf("再睡眠10秒-此时，再次打开test.txt文件，文件有内容了\n");
//	Sleep(10000);
//	fclose(pf);
//	//注：fclose在关闭文件的时候，也会刷新缓冲区
//	pf = NULL;
//
//	return 0;
//}

#include<stdio.h>
int main()
{
    long num = 0;
    FILE* fp = NULL;
    if ((fp = fopen("fname.dat", "r")) == NULL)
    {
        printf("Can’t open the file! ");
        exit(0);
    }
    while (fgetc(fp) != EOF)
    {
        num++;
    }
    printf("num=%d\n", num);
    fclose(fp);
    return 0;
}